<?php
/**
 * pinyin class file
 * 
 * 将汉字转化为拼音类
注：支持的汉字编码为gbk,汉字也是常用的汉字,对于生僻的汉字可能无法支持
 * 
 * @author lsl8966 <470663151@qq.com> 
 * @copyright Copyright (c) 2012 lsl8966 Software Studio
 * @link http://www.cnblogs.com/lsl8966
 * @version $Id: AutoLoad.class.php 1.0 2012-12-18 22:48:01Z lsl8966 $
 * @package lib
 * @since 1.0
 */

if (!defined('IN_PDK')){
     exit();
    }

class pinyin extends Base{
    
    /**
     * 汉字ASCII码库
     * 
     * @var array 
     */
     protected $lib;
    
    
    /**
     * 构造函数
     * 
     * @return void 
     */
     public function __construct(){
        
         }
    
    /**
     * 将ASCII编码转化为字符串.
     * 
     * @param integer $num 
     * @return string 
     */
     protected function num2str($num){
        
         if (!$this -> lib){
             $this -> parseLib();
             }
        
         if ($num > 0 && $num < 160){
            
             return chr($num);
             }elseif($num < -20319 || $num > -10247){
            
             return '';
             }else{
             $total = sizeof($this -> lib)-1;
             for($i = $total; $i >= 0; $i--){
                 if($this -> lib[$i][1] <= $num){
                     break;
                     }
                 }
            
             return $this -> lib[$i][0];
             }
         }
    
    /**
     * 返回汉字编码库
     * 
     * @return array 
     */
     protected function parseLib(){
        
         return $this -> lib = array(
            array("a", -20319),
             array("ai", -20317),
             array("an", -20304),
             array("ang", -20295),
             array("ao", -20292),
             array("ba", -20283),
             array("bai", -20265),
             array("ban", -20257),
             array("bang", -20242),
             array("bao", -20230),
             array("bei", -20051),
             array("ben", -20036),
             array("beng", -20032),
             array("bi", -20026),
             array("bian", -20002),
             array("biao", -19990),
             array("bie", -19986),
             array("bin", -19982),
             array("bing", -19976),
             array("bo", -19805),
             array("bu", -19784),
             array("ca", -19775),
             array("cai", -19774),
             array("can", -19763),
             array("cang", -19756),
             array("cao", -19751),
             array("ce", -19746),
             array("ceng", -19741),
             array("cha", -19739),
             array("chai", -19728),
             array("chan", -19725),
             array("chang", -19715),
             array("chao", -19540),
             array("che", -19531),
             array("chen", -19525),
             array("cheng", -19515),
             array("chi", -19500),
             array("chong", -19484),
             array("chou", -19479),
             array("chu", -19467),
             array("chuai", -19289),
             array("chuan", -19288),
             array("chuang", -19281),
             array("chui", -19275),
             array("chun", -19270),
             array("chuo", -19263),
             array("ci", -19261),
             array("cong", -19249),
             array("cou", -19243),
             array("cu", -19242),
             array("cuan", -19238),
             array("cui", -19235),
             array("cun", -19227),
             array("cuo", -19224),
             array("da", -19218),
             array("dai", -19212),
             array("dan", -19038),
             array("dang", -19023),
             array("dao", -19018),
             array("de", -19006),
             array("deng", -19003),
             array("di", -18996),
             array("dian", -18977),
             array("diao", -18961),
             array("die", -18952),
             array("ding", -18783),
             array("diu", -18774),
             array("dong", -18773),
             array("dou", -18763),
             array("du", -18756),
             array("duan", -18741),
             array("dui", -18735),
             array("dun", -18731),
             array("duo", -18722),
             array("e", -18710),
             array("en", -18697),
             array("er", -18696),
             array("fa", -18526),
             array("fan", -18518),
             array("fang", -18501),
             array("fei", -18490),
             array("fen", -18478),
             array("feng", -18463),
             array("fo", -18448),
             array("fou", -18447),
             array("fu", -18446),
             array("ga", -18239),
             array("gai", -18237),
             array("gan", -18231),
             array("gang", -18220),
             array("gao", -18211),
             array("ge", -18201),
             array("gei", -18184),
             array("gen", -18183),
             array("geng", -18181),
             array("gong", -18012),
             array("gou", -17997),
             array("gu", -17988),
             array("gua", -17970),
             array("guai", -17964),
             array("guan", -17961),
             array("guang", -17950),
             array("gui", -17947),
             array("gun", -17931),
             array("guo", -17928),
             array("ha", -17922),
             array("hai", -17759),
             array("han", -17752),
             array("hang", -17733),
             array("hao", -17730),
             array("he", -17721),
             array("hei", -17703),
             array("hen", -17701),
             array("heng", -17697),
             array("hong", -17692),
             array("hou", -17683),
             array("hu", -17676),
             array("hua", -17496),
             array("huai", -17487),
             array("huan", -17482),
             array("huang", -17468),
             array("hui", -17454),
             array("hun", -17433),
             array("huo", -17427),
             array("ji", -17417),
             array("jia", -17202),
             array("jian", -17185),
             array("jiang", -16983),
             array("jiao", -16970),
             array("jie", -16942),
             array("jin", -16915),
             array("jing", -16733),
             array("jiong", -16708),
             array("jiu", -16706),
             array("ju", -16689),
             array("juan", -16664),
             array("jue", -16657),
             array("jun", -16647),
             array("ka", -16474),
             array("kai", -16470),
             array("kan", -16465),
             array("kang", -16459),
             array("kao", -16452),
             array("ke", -16448),
             array("ken", -16433),
             array("keng", -16429),
             array("kong", -16427),
             array("kou", -16423),
             array("ku", -16419),
             array("kua", -16412),
             array("kuai", -16407),
             array("kuan", -16403),
             array("kuang", -16401),
             array("kui", -16393),
             array("kun", -16220),
             array("kuo", -16216),
             array("la", -16212),
             array("lai", -16205),
             array("lan", -16202),
             array("lang", -16187),
             array("lao", -16180),
             array("le", -16171),
             array("lei", -16169),
             array("leng", -16158),
             array("li", -16155),
             array("lia", -15959),
             array("lian", -15958),
             array("liang", -15944),
             array("liao", -15933),
             array("lie", -15920),
             array("lin", -15915),
             array("ling", -15903),
             array("liu", -15889),
             array("long", -15878),
             array("lou", -15707),
             array("lu", -15701),
             array("lv", -15681),
             array("luan", -15667),
             array("lue", -15661),
             array("lun", -15659),
             array("luo", -15652),
             array("ma", -15640),
             array("mai", -15631),
             array("man", -15625),
             array("mang", -15454),
             array("mao", -15448),
             array("me", -15436),
             array("mei", -15435),
             array("men", -15419),
             array("meng", -15416),
             array("mi", -15408),
             array("mian", -15394),
             array("miao", -15385),
             array("mie", -15377),
             array("min", -15375),
             array("ming", -15369),
             array("miu", -15363),
             array("mo", -15362),
             array("mou", -15183),
             array("mu", -15180),
             array("na", -15165),
             array("nai", -15158),
             array("nan", -15153),
             array("nang", -15150),
             array("nao", -15149),
             array("ne", -15144),
             array("nei", -15143),
             array("nen", -15141),
             array("neng", -15140),
             array("ni", -15139),
             array("nian", -15128),
             array("niang", -15121),
             array("niao", -15119),
             array("nie", -15117),
             array("nin", -15110),
             array("ning", -15109),
             array("niu", -14941),
             array("nong", -14937),
             array("nu", -14933),
             array("nv", -14930),
             array("nuan", -14929),
             array("nue", -14928),
             array("nuo", -14926),
             array("o", -14922),
             array("ou", -14921),
             array("pa", -14914),
             array("pai", -14908),
             array("pan", -14902),
             array("pang", -14894),
             array("pao", -14889),
             array("pei", -14882),
             array("pen", -14873),
             array("peng", -14871),
             array("pi", -14857),
             array("pian", -14678),
             array("piao", -14674),
             array("pie", -14670),
             array("pin", -14668),
             array("ping", -14663),
             array("po", -14654),
             array("pu", -14645),
             array("qi", -14630),
             array("qia", -14594),
             array("qian", -14429),
             array("qiang", -14407),
             array("qiao", -14399),
             array("qie", -14384),
             array("qin", -14379),
             array("qing", -14368),
             array("qiong", -14355),
             array("qiu", -14353),
             array("qu", -14345),
             array("quan", -14170),
             array("que", -14159),
             array("qun", -14151),
             array("ran", -14149),
             array("rang", -14145),
             array("rao", -14140),
             array("re", -14137),
             array("ren", -14135),
             array("reng", -14125),
             array("ri", -14123),
             array("rong", -14122),
             array("rou", -14112),
             array("ru", -14109),
             array("ruan", -14099),
             array("rui", -14097),
             array("run", -14094),
             array("ruo", -14092),
             array("sa", -14090),
             array("sai", -14087),
             array("san", -14083),
             array("sang", -13917),
             array("sao", -13914),
             array("se", -13910),
             array("sen", -13907),
             array("seng", -13906),
             array("sha", -13905),
             array("shai", -13896),
             array("shan", -13894),
             array("shang", -13878),
             array("shao", -13870),
             array("she", -13859),
             array("shen", -13847),
             array("sheng", -13831),
             array("shi", -13658),
             array("shou", -13611),
             array("shu", -13601),
             array("shua", -13406),
             array("shuai", -13404),
             array("shuan", -13400),
             array("shuang", -13398),
             array("shui", -13395),
             array("shun", -13391),
             array("shuo", -13387),
             array("si", -13383),
             array("song", -13367),
             array("sou", -13359),
             array("su", -13356),
             array("suan", -13343),
             array("sui", -13340),
             array("sun", -13329),
             array("suo", -13326),
             array("ta", -13318),
             array("tai", -13147),
             array("tan", -13138),
             array("tang", -13120),
             array("tao", -13107),
             array("te", -13096),
             array("teng", -13095),
             array("ti", -13091),
             array("tian", -13076),
             array("tiao", -13068),
             array("tie", -13063),
             array("ting", -13060),
             array("tong", -12888),
             array("tou", -12875),
             array("tu", -12871),
             array("tuan", -12860),
             array("tui", -12858),
             array("tun", -12852),
             array("tuo", -12849),
             array("wa", -12838),
             array("wai", -12831),
             array("wan", -12829),
             array("wang", -12812),
             array("wei", -12802),
             array("wen", -12607),
             array("weng", -12597),
             array("wo", -12594),
             array("wu", -12585),
             array("xi", -12556),
             array("xia", -12359),
             array("xian", -12346),
             array("xiang", -12320),
             array("xiao", -12300),
             array("xie", -12120),
             array("xin", -12099),
             array("xing", -12089),
             array("xiong", -12074),
             array("xiu", -12067),
             array("xu", -12058),
             array("xuan", -12039),
             array("xue", -11867),
             array("xun", -11861),
             array("ya", -11847),
             array("yan", -11831),
             array("yang", -11798),
             array("yao", -11781),
             array("ye", -11604),
             array("yi", -11589),
             array("yin", -11536),
             array("ying", -11358),
             array("yo", -11340),
             array("yo", -11340),
             array("yong", -11339),
             array("you", -11324),
             array("yu", -11303),
             array("yuan", -11097),
             array("yue", -11077),
             array("yun", -11067),
             array("za", -11055),
             array("zai", -11052),
             array("zan", -11045),
             array("zang", -11041),
             array("zao", -11038),
             array("ze", -11024),
             array("zei", -11020),
             array("zen", -11019),
             array("zeng", -11018),
             array("zha", -11014),
             array("zhai", -10838),
             array("zhan", -10832),
             array("zhang", -10815),
             array("zhao", -10800),
             array("zhe", -10790),
             array("zhen", -10780),
             array("zheng", -10764),
             array("zhi", -10587),
             array("zhong", -10544),
             array("zhou", -10533),
             array("zhu", -10519),
             array("zhua", -10331),
             array("zhuai", -10329),
             array("zhuan", -10328),
             array("zhuang", -10322),
             array("zhui", -10315),
             array("zhun", -10309),
             array("zhuo", -10307),
             array("zi", -10296),
             array("zong", -10281),
             array("zou", -10274),
             array("zu", -10270),
             array("zuan", -10262),
             array("zui", -10260),
             array("zun", -10256),
             array("zuo", -10254),
            );
         }
    
    
     
     /**
     * 汉字转化并输出拼音首字母
     * 
     * @param string $str 所要转化拼音的汉字
     * @param boolean $utf8 汉字编码是否为utf8
     * @param boolean $first 是否取其首字母
     * @return string 
     */
     public function output($str, $utf8 = true, $first = false){
        
         // 参数分析
        if (!$str){
             return false;
             }
        
         // 编码转换.
        $str = ($utf8 == true) ? iconv('utf-8', 'gbk', $str) : $str;
        $num = strlen($str);
        
         $pinyin = '';
         for ($i = 0; $i < $num; $i++){
             $temp = ord(substr($str, $i, 1));
             if ($temp > 160){
                 $temp2 = ord(substr($str, ++$i, 1));
                  $temp = $temp * 256 + $temp2-65536;
                 }
                 if($first) {
                     $pinyin .= substr($this -> num2str($temp), 0, 1);
                 } else {
                     $pinyin .= $this -> num2str($temp);
                 }
                 
             }
        
         // 输出的拼音编码转换.
        return ($utf8 == true) ? iconv('gbk', 'utf-8', $pinyin) : $pinyin;
     }
    
    /**
     * 析构函数
     * 
     * @access public 
     * @return void 
     */
     public function __destruct(){
        
         if (isset($this -> lib)){
             unset($this -> lib);
             }
         }
    }
